package cn.tedu.v4;

/**
        * 多线程并发安全问题：
        * 当多个线程并发操作同一个资源时候，由于线程切换时机不确定
        * 可能会导致代码执行混乱，而且还有可能出现重写错误、严重软件瘫痪【卡死】
        *
        * 客户端  多线程并发 ×     服务器  多线程并发 √
        *
        * synchronized  关键字   ---  多线程并发  同步锁
        *
        * 使用方式①：同步块方式  最常用，控制线程执行顺序，避免线程之间冲突
        *       ②：同步方法  一个线程执行完毕之后，在执行下一个
        *  定义语法：
        *  synchronized(同步监视器对象){
        *      需要同步运行的代码块；
        *  }
        *   案例：去厕所 问题
        */
public class Thread_syn {
    public static void main(String[] args) {
        //创建厕所类
        WC wc=new WC();
        //创建第一个人--线程
        Thread p1=new Thread(()->{
            wc.door();
        });
        Thread p2=new Thread(()->{
            wc.door();
        });
        p1.start();
        p2.start();
    }
}
//创建厕所类
class WC{
    public void door(){ //去厕所
        //线程实例--记录线程信息
        Thread s=Thread.currentThread();
        System.out.println(s.getName()+"去厕所....");
        try {
            // 同步锁：门加一把锁功能
            // 多线程执行 同步锁，每次只放行一个线程
            synchronized (this){
                Thread.sleep(5000);
                System.out.println(s+"找门进去.....");
            }
            Thread.sleep(3000);
            System.out.println(s+"穿裤子走人..");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
